﻿using mesan.core.Managers;
using mesan.core.Repository;
using mesan.crosscutting.IoC;
using Should;
using TechTalk.SpecFlow;

namespace mesan.core.specifications.Core
{
	[Binding]
	public class Innlogging_Steps : BaseSteps
	{
		[BeforeScenario("innlogging")]
		public static void InitializeScenarioWithMockedEndpointsRegistry()
		{
			PutDiContainerIntoContext();
		}

		[Given(@"at jeg har glemt passordet mitt")]
		public void GittAtJegHarGlemtPassordetMitt()
		{
			ScenarioContext.Current.Set("pedro@digitaldias.com");
		}

		[When(@"jeg logger på med gyldig brukernavn og passord")]
		public void NarJegLoggerPaMedGyldigBrukernavnOgPassord()
		{
			// Arrange			
			string userName = "Pedro";
			string password = "V4ryS3cr33T!";

			var loginManager = DiContainer.Get<ILoginManager>();
			var validatorMock = GetMockFor<IValidationRepository>();
			validatorMock.Setup(o => o.Validate(userName, password)).Returns(true);

			// Act
			var loginResult = loginManager.Validate(userName, password);

			ScenarioContext.Current.Set(loginResult);
		}

		[When(@"jeg logger på med blankt passord")]
		public void NarJegLoggerPaMedBlanktPassord()
		{
			string username      = "pedro";
			string blankPassword = string.Empty;

			var result = DiContainer.Get<ILoginManager>().Validate(username, blankPassword);

			SetContextValue(result);
		}

		[When(@"jeg forsøker å gjøre en innlogging")]
		public void NarJegForsokerAGjoreEnInnlogging()
		{
			var username = GetContextValue<string>("username");
			var password = GetContextValue<string>("password");

			var result = DiContainer.Get<ILoginManager>().Validate(username, password);
			SetContextValue(result);			
		}

		[Given(@"at jeg ikke har oppgitt brukernavn og passord")]
		public void GittAtJegIkkeHarOppgittBrukernavnOgPassord()
		{
			var emptyUsername = string.Empty;
			var emptyPassword = string.Empty;

			SetContextValue(emptyUsername, "username");
			SetContextValue(emptyPassword, "password");
		}

		[Then(@"blir resultatet av innloggingen negativt")]
		public void SaBlirResultatetAvInnloggingenNegativt()
		{
			var result = GetContextValue<bool>();

			result.ShouldBeFalse("Forventet nekting av login her");
		}

		[Then(@"blir svaret positivt")]
		public void SaBlirSvaretPositivt()
		{
			var result = ScenarioContext.Current.Get<bool>();

			result.ShouldBeTrue("Forventet et positivt svar nå");
		}

		[When(@"jeg ber om å få tilsendt et nytt passord")]
		public void NarJegBerOmAFaTilsendtEtNyttPassord()
		{
			var userEmail = ScenarioContext.Current.Get<string>();
			var ioc = ScenarioContext.Current.Get<IDiContainer>();
			var loginManager = ioc.Get<ILoginManager>();

			loginManager.RequestPasswordReset(userEmail);
		}
	}
}
